package jwts

import (
	"fmt"
	"gitee.com/zhengjianfeng/pay/conf"
	"github.com/iris-contrib/middleware/jwt"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
)

var BaseLoginInfo *LoginInfo

// 登录成功后需求保存的信息
type LoginInfo struct {
	AccountId  int64  `json:"account_id"`  // 登录账号的ID
	Nickname   string `json:"nickname"`    // 登录账号的昵称
	Username   string `json:"username"`    // 登录账号
	RoleType   int    `json:"role_type"`   // 登录角色类型
	RelevantId int64  `json:"relevant_id"` // 相关的ID 如果ReleType等于1那么RelevantId为管理员ID
	Exp        int64  `json:"exp"`         // 过期时间 单位毫秒
}

// ResModel 返回数据模板
type ResModel struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

// 签发人
//"iss": "iris",
// 签发时间
//"iat": time.Now().Unix(),
var JwtHandler = jwt.New(jwt.Config{
	// 从请求头的Authorization字段中提取，这个是默认值
	Extractor: jwt.FromAuthHeader,

	// 设置一个函数返回秘钥，关键在于return []byte("这里设置秘钥")
	ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
		return conf.JwtSecret, nil
	},

	// 设置一个加密方法
	SigningMethod: jwt.SigningMethodHS256,

	ErrorHandler: func(ctx context.Context, err error) {

		if err == nil {

			fmt.Println(1111)
			GetBaseLoginInfo(ctx)

			return
		}

		ctx.StopExecution()
		ctx.StatusCode(iris.StatusUnauthorized)
		_, _ = ctx.JSON(ResModel{
			Code: 501,
			Msg:  err.Error(),
		})
	},
})

// 获取登录后的基本信息
func GetBaseLoginInfo(ctx iris.Context) {
	var (
		data   interface{}
		claims jwt.MapClaims
	)

	data = ctx.Values().Get("jwt").(*jwt.Token)

	var (
		token *jwt.Token
	)
	token = data.(*jwt.Token)

	claims = token.Claims.(jwt.MapClaims)

	BaseLoginInfo = &LoginInfo{
		AccountId:  (int64)(claims["account_id"].(float64)),
		Nickname:   claims["nickname"].(string),
		Username:   claims["username"].(string),
		RoleType:   (int)(claims["role_type"].(float64)),
		RelevantId: (int64)(claims["relevant_id"].(float64)),
		Exp:        (int64)(claims["exp"].(float64)),
	}

	// If everything ok then call next.
	ctx.Next()
}
